﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Telecom.Data;
using Telecom.Service;
using TelecomGis.Helper.Control;

namespace TelecomGis.Controllers
{
    public class TCapquangController : ContronllerBase
    {
        private readonly CapquangService _CapquangService = new CapquangService();
        private readonly loaiPhaSer _loaiPhaSer = new loaiPhaSer();
        private readonly LoaiCapService _LoaiCapService = new LoaiCapService();
        private readonly hangSXSer _hangSXSer = new hangSXSer();
        private readonly LoaiSoiServer _LoaiSoiServer = new LoaiSoiServer();
        private readonly LoaiLapDatService _LoaiLapDatService = new LoaiLapDatService();
        private readonly ODFService _ODFService = new ODFService();
        private readonly vnptSiteSer _vnptSiteSer = new vnptSiteSer();
        private readonly loaiOdfService _loaiOdfService = new loaiOdfService();
        private readonly loaiPortSer _loaiPortSer = new loaiPortSer();
        //
        // GET: /TCapquang/

        public ActionResult Capquang()
        {
            return PartialView();
        }

        public string Get_Odf_ById(int ma)
        {
            var _listEntity = _ODFService.GetbyId(ma);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string Get_SoiQuang_ById(int ma)
        {
            var _listEntity = _ODFService.GetSoiQuangById(ma);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string Get_Odf_ById_Get_Ten(int ma)
        {
            var _listEntity = _ODFService.GetbyId(ma).TEN;

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string Get_loaiso_ById(string ma)
        {
            var _listEntity = _LoaiSoiServer.GetbyId(ma);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string Get_loaipha_ById(decimal ma)
        {
            var _listEntity = _loaiPhaSer.GetById(ma);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string Get_loailapdat_ById(string ma)
        {
            var _listEntity = _LoaiLapDatService.GetbyId(ma);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiPha()
        {

            var _listEntity = _loaiPhaSer.getListAll();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiCap()
        {

            var _listEntity = _LoaiCapService.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiHangSX()
        {

            var _listEntity = _hangSXSer.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiSoi()
        {

            var _listEntity = _LoaiSoiServer.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLapDat()
        {

            var _listEntity = _LoaiLapDatService.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiODF()
        {

            var _listEntity = _loaiOdfService.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListLoaiPort()
        {

            var _listEntity = _loaiPortSer.getList();

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        public string ListODfBySiteId(int siteId)
        {

            var _listEntity = _ODFService.getList(siteId);

            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });
        }

        [HttpPost]
        public JsonResult ListODfBySiteIdJtable(int siteId)
        {
            try
            {
                var cities = _ODFService.GetbyId(siteId);
                return Json(new { Result = "OK", Options = cities });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }

        public ActionResult ListCapQuang(string donvi, string toql, string type)
        {
            var _listEntity = new List<CAPQUANG>();

            if (type == "null")
            {
                _listEntity = new List<CAPQUANG>();
            }
            else if(type == "all")
            {
                _listEntity = _CapquangService._listCapQuanByDVTOArray(UtContextgis._UserPageContext.DonViByUser, UtContextgis._UserPageContext.ToKtByuser);
            }
            else
            {
                switch (type)
                {
                    case "dv":

                        List<string> myDonvi = new List<string>();
                        myDonvi.Add(donvi);
                        _listEntity = _CapquangService._listCapQuanByDVTOArray(myDonvi.ToArray(),UtContextgis._UserPageContext.ToKtByuser);


                        break;
                    case "toql":

                        List<string> mytoql = new List<string>();
                        mytoql.Add(toql);
                        _listEntity = _CapquangService._listCapQuanByDVTOArray(UtContextgis._UserPageContext.DonViByUser, mytoql.ToArray());

                        break;
                    default:
                        _listEntity = _CapquangService._listCapQuanByDVTOArray(UtContextgis._UserPageContext.DonViByUser, UtContextgis._UserPageContext.ToKtByuser);
                        break;

                }

            }

            return Json(new { Result = "OK", Records = _listEntity, TotalRecordCount = _listEntity.Count }, JsonRequestBehavior.AllowGet);

        }

        public ActionResult ListSoiQuangByCapQuang(int capquangId)
        {
            var _listEntity = new List<SOIQUANG>();

            _listEntity = _CapquangService._listSoiQuangByCapQuan(capquangId);

            return Json(new { Result = "OK", Records = _listEntity, TotalRecordCount = _listEntity.Count }, JsonRequestBehavior.AllowGet);

        }

        public ActionResult AddCapQuang(string _donviql, string _toql)
        {
            CAPQUANG model = new CAPQUANG();
            model.ID = 0;
            model.DONVIQL = _donviql;
            model.TOQL = _toql;

            ViewBag.DateNowLAPCAPQUANG = DateTime.Now.Day + "/" + DateTime.Now.Month + "/" + DateTime.Now.Year;



            return PartialView(model);

        }

        public ActionResult updateCapQuang(int Id)
        {
            CAPQUANG model = _CapquangService.GetbyId(Id);

            ViewBag.SiteIdDauGan = _ODFService.GetbyId(model.ODF1.Value);
            ViewBag.SiteIdDauXa = _ODFService.GetbyId(model.ODF2.Value);


            ViewBag.VNPTSITE_DAU_GAN = _vnptSiteSer.GetById(ViewBag.SiteIdDauGan.SITEID);
            ViewBag.VNPTSITE_DAU_XA = _vnptSiteSer.GetById(ViewBag.SiteIdDauXa.SITEID);

            return PartialView(model);

        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddCapQuang(CAPQUANG model)
        {

            if (string.IsNullOrEmpty(model.DONVIQL))
            {
                return JsonError("Vui lòng chọn đơn vị quản lý");
            }

            if (string.IsNullOrEmpty(model.TOQL))
            {
                return JsonError("Vui lòng chọn tổ quản lý");
            }

            if (string.IsNullOrEmpty(model.LOAICAP))
            {
                return JsonError("Vui lòng chọn loại cáp");
            }

            if (model.LOAIPHA == null || model.LOAIPHA == 0)
            {
                return JsonError("Vui lòng chọn loại pha");
            }

            if (string.IsNullOrEmpty(model.MA))
            {
                return JsonError("Vui lòng nhập mã cáp");
            }

            model.MA = model.MA.ToUpper();

            var entityCheck = _CapquangService.GetbyStringMa(model.MA);
            if (entityCheck != null && !string.IsNullOrEmpty(entityCheck.TEN))
            {
                return JsonError("Mã Cáp quang đã tồn tại, vui lòng xem lại");
            }


            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập tên cáp");
            }


            if (model.ODF1 == null || model.ODF1 == 0)
            {
                return JsonError("Vui lòng chọn odf đầu gần ");
            }

            if (model.ODF2 == null || model.ODF2 == 0)
            {
                return JsonError("Vui lòng chọn odf đầu xa");
            }

            if (!IsNumber(model.CHIEUDAI.ToString()))
            {
                return JsonError("Vui lòng nhập chiều dài cáp ( Chiều dài cấp là số )");
            }

            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập dung lượng cáp ( Dung lượng cấp là số )");
            }

            if (string.IsNullOrEmpty(model.HANGSX))
            {
                return JsonError("Vui lòng chọn hãng sản xuất của cáp quang");
            }

            if (string.IsNullOrEmpty(model.LOAISOI))
            {
                return JsonError("Vui lòng chọn loại sợi của cáp quang");
            }

            if (string.IsNullOrEmpty(model.LAPDAT))
            {
                return JsonError("Vui lòng chọn loại lắp đặt của cáp quang");
            }

            var requestVNPT_DAU_GAN = Request["vnpt_dau_gan_cap_quan_hidden"];
            var requestVNPT_DAU_XA = Request["vnpt_dau_xa_cap_quan_hidden"];

            try
            {
                var site1 = _vnptSiteSer.GetById(int.Parse(requestVNPT_DAU_GAN));
                var site2 = _vnptSiteSer.GetById(int.Parse(requestVNPT_DAU_XA));

                string _poly_control_geometry = "POLYLINE((";

                _poly_control_geometry += site1.Y + " " + site1.X + ",";
                _poly_control_geometry += site2.Y + " " + site2.X + ",";


                _poly_control_geometry += "))";

                model.GEOMETRY = _poly_control_geometry;
            }
            catch(Exception ex){
                model.GEOMETRY = "";
            }

            _CapquangService.addorUpdate(model);

            return JsonSuccess("");

        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult UpdateCapQuang(CAPQUANG model)
        {

            if (string.IsNullOrEmpty(model.DONVIQL))
            {
                return JsonError("Vui lòng chọn đơn vị quản lý");
            }

            if (string.IsNullOrEmpty(model.TOQL))
            {
                return JsonError("Vui lòng chọn tổ quản lý");
            }

            if (string.IsNullOrEmpty(model.LOAICAP))
            {
                return JsonError("Vui lòng chọn loại cáp");
            }

            if (model.LOAIPHA == null || model.LOAIPHA == 0)
            {
                return JsonError("Vui lòng chọn loại pha");
            }

            if (string.IsNullOrEmpty(model.MA))
            {
                return JsonError("Vui lòng nhập mã cáp");
            }

            model.MA = model.MA.ToUpper();

            var requsetMaOld = Request["ma_cap_quang_old_hidden"];
            if (requsetMaOld.ToUpper() != model.MA.ToUpper())
            {
                
                var entityCheck = _CapquangService.GetbyStringMa(model.MA);
                if (entityCheck != null && !string.IsNullOrEmpty(entityCheck.TEN))
                {
                    return JsonError("Mã Cáp quang bạn thay đổi đã tồn tại, vui lòng xem lại");
                }
            }


            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập tên cáp");
            }


            if (model.ODF1 == null || model.ODF1 == 0)
            {
                return JsonError("Vui lòng chọn odf đầu gần ");
            }

            if (model.ODF2 == null || model.ODF2 == 0)
            {
                return JsonError("Vui lòng chọn odf đầu xa");
            }

            if (!IsNumber(model.CHIEUDAI.ToString()))
            {
                return JsonError("Vui lòng nhập chiều dài cáp ( Chiều dài cấp là số )");
            }

            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập dung lượng cáp ( Dung lượng cấp là số )");
            }

            if (string.IsNullOrEmpty(model.HANGSX))
            {
                return JsonError("Vui lòng chọn hãng sản xuất của cáp quang");
            }

            if (string.IsNullOrEmpty(model.LOAISOI))
            {
                return JsonError("Vui lòng chọn loại sợi của cáp quang");
            }

            if (string.IsNullOrEmpty(model.LAPDAT))
            {
                return JsonError("Vui lòng chọn loại lắp đặt của cáp quang");
            }

            var requestVNPT_DAU_GAN = Request["vnpt_dau_gan_cap_quan_hidden"];
            var requestVNPT_DAU_XA = Request["vnpt_dau_xa_cap_quan_hidden"];

            try
            {
                var site1 = _vnptSiteSer.GetById(int.Parse(requestVNPT_DAU_GAN));
                var site2 = _vnptSiteSer.GetById(int.Parse(requestVNPT_DAU_XA));

                string _poly_control_geometry = "POLYLINE((";

                _poly_control_geometry += site1.Y + " " + site1.X + ",";
                _poly_control_geometry += site2.Y + " " + site2.X + ",";


                _poly_control_geometry += "))";

                model.GEOMETRY = _poly_control_geometry;
            }
            catch (Exception ex)
            {
                model.GEOMETRY = "";
            }

            _CapquangService.addorUpdate(model);

            return JsonSuccess("");

        }

        public ActionResult AddVNPTSITE_CAP_QUANG(string ma, string ten, string donvi, string toql, string LoaiSite)
        {
            VNPT_SITE model = new VNPT_SITE();
            model.SITEID = 0;
            model.DONVIQL = donvi;
            model.TOQL = toql;
            model.ISNEW = 1;
            model.MA = ma;
            model.TEN = model.TEN;

            ViewBag.LoaiSiteCap = LoaiSite;

            return PartialView("_AddVNPTSITE_CAP_QUANG", model);
        }

        public ActionResult UpdateVNPTSITE_CAPQUANG(int SiteId, string LoaiSiteUpCQ)
        {
            VNPT_SITE model = new VNPT_SITE();
            model = _vnptSiteSer.GetById(SiteId);

            ViewBag.LoaiSiteCapUPDATE = LoaiSiteUpCQ;

            return PartialView("_UpdateVNPTSITE_CAPQUANG", model);
        }

        public ActionResult AddOdf(int siteId, string type)
        {
            ODF model = new ODF();
            model.SITEID = siteId;
            model.ID = 0;
            model.SOPORT = 0;
            ViewBag.NameSiteEntity = _vnptSiteSer.GetById(siteId);

            ViewBag.typeODF = type;

            return PartialView(model);
        }

        public ActionResult UpdateOdf(string OdfId, string type)
        {
            ODF model = _ODFService.GetbyId(int.Parse(OdfId));

            ViewBag.NameSiteEntity = _vnptSiteSer.GetById(model.SITEID.Value);

            ViewBag.typeODF = type;

            return PartialView(model);

        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddOdf(ODF model)
        {
            if (string.IsNullOrEmpty(model.MA))
            {
                return JsonError("Vui lòng nhập mã ODF");
            }

            model.MA = model.MA.ToUpper();

            var entityCheck = _ODFService.GetbyStringMa(model.MA);
            if (entityCheck != null && !string.IsNullOrEmpty(entityCheck.TEN))
            {
                return JsonError("Mã ODF đã tồn tại, vui lòng xem lại");
            }


            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập tên ODF");
            }

            if (!IsNumber(model.SOPORT.ToString()))
            {
                return JsonError("Vui lòng nhập số port là số");
            }

            if (string.IsNullOrEmpty(model.LOAIPORT))
            {
                return JsonError("Vui lòng chọn loại port");
            }

            if (string.IsNullOrEmpty(model.LOAIODF))
            {
                return JsonError("Vui lòng chọn loại odf");
            }

            _ODFService.addorUpdate(model);

            var entityFinnal = _ODFService.GetbyStringMa(model.MA);


            return JsonSuccess(entityFinnal.ID.ToString());
        }

        [HttpPost]
        public ActionResult UpdateOdf(ODF model)
        {
            if (string.IsNullOrEmpty(model.MA))
            {
                return JsonError("Vui lòng nhập mã ODF");
            }

            var maOld = Request["ma_odf_old"];

            
            model.MA = model.MA.ToUpper();

            if (maOld.ToUpper() != model.MA)
            {
                var entityCheck = _ODFService.GetbyStringMa(model.MA);
                if (entityCheck != null && !string.IsNullOrEmpty(entityCheck.TEN))
                {
                    return JsonError("Mã ODF bạn thay đã tồn tại, vui lòng xem lại");
                }
            }

            if (string.IsNullOrEmpty(model.TEN))
            {
                return JsonError("Vui lòng nhập tên ODF");
            }

            if (!IsNumber(model.SOPORT.ToString()))
            {
                return JsonError("Vui lòng nhập số port là số");
            }

            if (string.IsNullOrEmpty(model.LOAIPORT))
            {
                return JsonError("Vui lòng chọn loại port");
            }

            if (string.IsNullOrEmpty(model.LOAIODF))
            {
                return JsonError("Vui lòng chọn loại odf");
            }

            _ODFService.addorUpdate(model);

            var entityFinnal = _ODFService.GetbyStringMa(model.MA);


            return JsonSuccess(entityFinnal.ID.ToString());

        }

        [HttpPost]
        public JsonResult UpdateSoiQuangByCapQuang(SOIQUANG _port)
        {
            try
            {
                var entity = _CapquangService.GetSOIQUANGbyId(_port.ID);
                entity.TRANGTHAI = _port.TRANGTHAI;
                entity.GHICHU = _port.GHICHU;
                _CapquangService.addorUpdate_SoiQuang(entity);

                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }

        public ContentResult LoadOnmapsView_CapQuang_loai_cap(string loaiCap)
        {


            string[] int_loai_cap = null;


            if (loaiCap == "0")
            {
                int_loai_cap = _LoaiCapService.getList().Select(p => p.MA).ToArray();
            }
            else
            {
                int_loai_cap = loaiCap.Split(',').ToArray();
            }

           

            string jspoly_line = "";
            char[] phay = { ',' };
            char[] khoangtrang = { ' ' };

            List<CAPQUANG> ListEntity = new List<CAPQUANG>();
            ListEntity = _CapquangService.GetCapQuangByQuanHuyenId_loaicap(UtContextgis._UserPageContext.QuanHuyenByUser, int_loai_cap);
            string json_control = "{ cap_quang : [";
            if (ListEntity != null && ListEntity.Count > 0)
            {
                foreach (var item in ListEntity)
                {//{ name : "Record 0", column1 : "0", column2 : "0" },
                    var site1 = _vnptSiteSer.GetById(_ODFService.GetbyId(item.ODF1.Value).SITEID.Value);
                    var site2 = _vnptSiteSer.GetById(_ODFService.GetbyId(item.ODF2.Value).SITEID.Value);
                    var loai_cap = _LoaiCapService.GetById(item.LOAICAP);
                    json_control += "{id:\"" + item.ID.ToString() + "\",";
                    json_control += "ma:\"" + item.MA + "\",";
                    json_control += "ten:\"" + item.TEN + "\",";
                    json_control += "site1:\"" + item.ODF1.ToString() + "\",";
                    json_control += "site2:\"" + item.ODF2.ToString() + "\",";
                    json_control += "chieudai:\"" + item.CHIEUDAI.ToString() + "\",";
                    json_control += "dungluong:\"" + item.DUNGLUONG.ToString() + "\",";
                    json_control += "hangsx:\"" + item.HANGSX.ToString() + "\",";
                    json_control += "loaisoi:\"" + item.LOAISOI + "\",";
                    json_control += "color:\"" + loai_cap.COLOR + "\",";
                    json_control += "loaipha:\"" + item.LOAIPHA.ToString() + "\",";
                    json_control += "loaicap:\"" + item.LOAICAP + "\",";
                    //json_control += "tramql:\"" + site1.t + "\",";
                    json_control += "doviql:\"" + site1.DONVIQL + "\",";
                    json_control += "Vnptodf1:\"" + site1.MA.ToString() + "\",";
                    json_control += "Vnptodf2:\"" + site2.MA.ToString() + "\",";
                    json_control += "lapdat:\"" + item.LAPDAT + "\",";
                    //json_control += "ngaylapdat:new Date(\"" + ((DateTime)(item.NGAYLD)).ToString("MM/dd/yyyy") + "\"),";
                    json_control += "nghichu:\"" + item.GHICHU + "\",";
                    jspoly_line = "";
                    //POLYGON((10.039894361936945 105.74109077453613, 10.03030161644126 105.75220584869385,10.011242059206497 105.73156356811523,10.03063969159797 105.72688579559326,10.037358862127688 105.72431087493896,10.040063394551312 105.72864532470703,10.039175972340953 105.73250770568848,10.04162694204852 105.73572635650635,10.039894361936945 105.74109077453613))
                    try
                    {
                        string data = item.GEOMETRY;

                        if (string.IsNullOrEmpty(data))
                        {
                            jspoly_line += site1.Y + "," + site1.X + "/";
                            jspoly_line += site2.Y + "," + site2.X + "/";

                        }
                        else
                        {
                            data = data.Replace("POLYLINE((", "");
                            data = data.Replace("))", "");
                            string[] jsdata = data.Split(phay);
                            for (int y = 0; y < jsdata.Length - 1; ++y)
                            {

                                string[] datamain = jsdata[y].Split(khoangtrang);
                                jspoly_line += datamain[0] + "," + datamain[1] + "/";
                            }
                        }


                    }
                    catch
                    {

                    }
                    json_control += "_cap_quang_line_lat_lng:\"" + jspoly_line + "\",";
                    json_control += "geometry:\"" + item.POLYGON + "\"},";
                }
            }
            json_control += "]}";

            return Content(json_control);
        }

        public ActionResult ViewSoiQuangOnOdf(int Id)
        {
            ODF model = _ODFService.GetbyId(Id);
            return PartialView(model);
        }

        public ActionResult ListODFSoiQuangByOdf(int OdfId)
        {
            var _listEntity = _ODFService.getListODFSoiQuang(OdfId);
            return Json(new { Result = "OK", Records = _listEntity, TotalRecordCount = _listEntity.Count }, JsonRequestBehavior.AllowGet);
        }

    }
}
